package io.kiki.stack.http.feign;

import io.kiki.stack.http.feign.Logger.Level;
import io.kiki.stack.http.feign.codec.Decoder;
import io.kiki.stack.http.feign.codec.ErrorDecoder;

import java.lang.reflect.Type;
import java.util.concurrent.CompletableFuture;

/**
 * The response handler that is used to provide asynchronous support on top of standard response
 * handling
 */
@Experimental
class AsyncResponseHandler {
    private final ResponseHandler responseHandler;

    AsyncResponseHandler(Level logLevel, Logger logger, Decoder decoder, ErrorDecoder errorDecoder, boolean dismiss404, boolean closeAfterDecode, boolean decodeVoid, ResponseInterceptorChain executionResponseInterceptorChain) {
        this.responseHandler = new ResponseHandler(logLevel, logger, decoder, errorDecoder, dismiss404, closeAfterDecode, decodeVoid, executionResponseInterceptorChain);
    }

    public CompletableFuture<Object> handleResponse(String configKey, Response response, Type returnType, long elapsedTime) {
        CompletableFuture<Object> resultFuture = new CompletableFuture<>();
        handleResponse(resultFuture, configKey, response, returnType, elapsedTime);
        return resultFuture;
    }

    /**
     * @deprecated use {@link #handleResponse(String, Response, Type, long)} instead.
     */
    @Deprecated()
    void handleResponse(CompletableFuture<Object> resultFuture, String configKey, Response response, Type returnType, long elapsedTime) {
        try {
            resultFuture.complete(this.responseHandler.handleResponse(configKey, response, returnType, elapsedTime));
        } catch (Exception e) {
            resultFuture.completeExceptionally(e);
        }
    }
}
